/**
 * 
 */
package cn.biplam.common.runtime;

import java.util.ArrayList;

import cn.biplam.common.client.Log;
import cn.biplam.common.client.Log.Log_Level;
import cn.biplam.common.wrapper.Date;
import cn.biplam.common.wrapper.ErrorMessage;

/**
 * 任务基础类(所有纳入任务管理的运行对象的基础类)
 * @author 	WangSong 2009-6-26 下午07:05:01
 * @version 1.0
 */
public abstract class TaskBase extends Thread{

	private Date dStartTime;
	private String sComment;

	/**
	 * 构造方法 传入任务名称初始化
	 * @param sTaskName
	 */
	public TaskBase(String sTaskName){
		super(sTaskName);
		this.dStartTime=new Date();
	}

	/**
	 * @return 任务说明
	 */
	public String getComment() {
		return sComment;
	}

	/**
	 * 返回字符串表示的开始时间
	 * @return
	 */
	public String getStartTime(){
		return this.dStartTime.getDateTime();
	}

	/**
	 * 返回字符串表示经过的时间
	 * @return
	 */
	public String getTimeLen() {
		return dStartTime.getDiffDate();
	}

	/**
	 * @param 任务说明
	 */
	public void setComment(String comment) {
		this.sComment = comment;
	}

	/**
	 * 任务执行入口，实现类需在其内部的单次循环结束时调用Thread.sleep(1)以支持中断退出
	 * @throws InterruptedException
	 * @throws ErrorMessage
	 */
	protected abstract void _run() throws InterruptedException,ErrorMessage;
	
	/**
	 * 返回任务执行状态的说明
	 * @return String
	 */
	public abstract String getStatus();
	
	/**
	 * 任务运行时的提示信息记录，如需要的话，可覆写此类
	 * @return
	 */
	public ArrayList<String> getStatusPrompt(){
		return null;
	}
	
	public abstract boolean getFinished();

	/**
	 * 任务执行入口
	 */
	public void run(){
		try{
			try {
				this._run();
				Task.popTask(this.getName());
			} catch (InterruptedException e) {
				Task.popTask(this.getName());
			} catch (ErrorMessage e) {
				Task.popTask(this.getName());
				Log.write(e, Log_Level.Error);
			}
		}catch(ErrorMessage e){
			e.printStackTrace();
			Log.write(e, Log_Level.Error);
		}
	}
}
